import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * bean工厂
 * @Author ChenJin
 * @date 2021/10/15 15:26
 * Description:
 **/
public class BeanFactory {

    // 声明一个容器，把所有的bean都通过反射解析好，并装载到map中
    // 当getBean被调用的适合，判断容器中是否存在，存在就返回bean，不存在就返回null
    private static Map<String ,Object> beanMap = new HashMap<>(16);

    private static ResourceBundle resourceBundle = null;

    // 把加载配置文件进行封装
    static {
        resourceBundle = ResourceBundle.getBundle("properties/bean");
        Enumeration<String> keys = resourceBundle.getKeys();
        while (keys.hasMoreElements()){
            String beanName = keys.nextElement();
            String className = resourceBundle.getString(beanName);

            try {
                // 获取对应的class对象
                Class<?> object = Class.forName(className);
                // 最终获取的bean的实例
                Object instance = object.newInstance();
                beanMap.put(beanName,instance);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        }
    }

    // 对外提供一个方法 getBean，快速提供bean的实例
    // 利用泛型升级：需要什么类型就传递类型的参数
//    public static <T> T getBean(String beanName,Class<T> clazz)throws Exception{
//        // 通过getString（key）获取对应的value
//        String className = resourceBundle.getString(beanName);
//        Class<?> obj = Class.forName(className);
//        return (T)obj.newInstance();
//    }

    public static <T> T getBean(String beanName,Class<T> clazz)throws Exception{
        // 所有的bean都被加载到map中，只需要通过参数获取bean
        // 根据泛型返回对应类型

        return (T)beanMap.get(beanName);
    }
}
